package com.magic.himalaya.presenters;

import androidx.annotation.Nullable;

import com.magic.himalaya.interfaces.IRecommendViewCallBack;
import com.magic.himalaya.interfaces.IRecommendPresenter;
import com.magic.himalaya.utils.Constants;
import com.magic.himalaya.utils.LogUtil;
import com.ximalaya.ting.android.opensdk.constants.DTransferConstants;
import com.ximalaya.ting.android.opensdk.datatrasfer.CommonRequest;
import com.ximalaya.ting.android.opensdk.datatrasfer.IDataCallBack;
import com.ximalaya.ting.android.opensdk.model.album.Album;
import com.ximalaya.ting.android.opensdk.model.album.GussLikeAlbumList;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description: 接口实现层，用于获取数据
 * @create: Create by Magic on 2022/1/21.
 */
public class RecommendPresenter implements IRecommendPresenter {

    private static final String TAG = RecommendPresenter.class.getSimpleName();

    private List<IRecommendViewCallBack> callBackList = new ArrayList<>();

    private static RecommendPresenter mInstance = null;

    private List<Album> mAlbumList = new ArrayList<>();

    /**
     * 懒汉式
     *
     * @return
     */
    public static RecommendPresenter getInstance() {
        if (mInstance == null) {
            //同步锁
            synchronized (RecommendPresenter.class) {
                if (mInstance == null) {
                    mInstance = new RecommendPresenter();
                }
            }
        }
        return mInstance;
    }

    /**
     * 获取首页第一个专辑的Album数据
     *
     * @return
     */
    public Album getDataListByFirst() {
        if (mAlbumList != null && mAlbumList.size() != 0) {
            return mAlbumList.get(0);
        }
        return null;
    }

    /**
     * 网络错误时进行通知UI更新页面显示错误
     */
    private void handlerError() {
        if (callBackList != null) {
            for (IRecommendViewCallBack callBack : callBackList) {
                callBack.onNetworkError();
            }
        }
    }

    /**
     * 获得数据后通知线程UI渲染数据
     *
     * @param albumList
     */
    private void handlerRecommendResult(List<Album> albumList) {
        //通知UI进行更新
        if (albumList != null) {
            if (albumList.size() == 0) {  //当数据为空时 显示 空页面
                for (IRecommendViewCallBack callBack : callBackList) {
                    callBack.onRecommendEmpty();
                }
            } else { //有数据时，渲染数据
                mOnInitDataListener.returnFirstData(albumList.get(0));
                for (IRecommendViewCallBack iRecommendCallBack : callBackList) {
                    iRecommendCallBack.getRecommendListLoaded(albumList);   //将数据填充到回调函数中,回调至主线程进行数据渲染处理
                }
            }
        }
    }

    /**
     * 加载数据时 通知线程UI渲染为 <加载中页面>
     */
    private void handlerLoading() {
        for (IRecommendViewCallBack callBack : callBackList) {
            callBack.onLoading();
        }
    }

    //====================== 业务层实现

    /**
     * 下拉刷新，获取推荐内容数据(猜你喜欢专辑)
     * 接口于API文档 :  3.10.6 获取猜你喜欢专辑
     */
    @Override
    public void getRecommendList() {

        handlerLoading();//在请求网络数据时切换成 <加载中页面>
        requstRecommendData(-1);
    }

    /**
     * 请求推荐列表数据
     *
     * @param i
     */
    private void requstRecommendData(int i) {
        Map<String, String> map = new HashMap<String, String>();//封装参数
        map.put(DTransferConstants.LIKE_COUNT, Constants.RECOMMENDCOUNT + "");//一页数据返回多少条,max=10
        map.put(DTransferConstants.CATEGORY_ID, "0");//0为热门分类
        CommonRequest.getGuessLikeAlbum(map, new IDataCallBack<GussLikeAlbumList>() {
            /**
             * 成功获取到数据
             * @param gussLikeAlbumList
             */
            @Override
            public void onSuccess(@Nullable GussLikeAlbumList gussLikeAlbumList) {
                if (gussLikeAlbumList != null) {
                    List<Album> albumList = gussLikeAlbumList.getAlbumList();//将获得的数据放在集合中
                    if (i == -1) {   //下拉刷新，重新获得数据
                        mAlbumList.clear();
                        mAlbumList.addAll(albumList);
                        //通知UI线程渲染更新数据
                        handlerRecommendResult(mAlbumList);
                    } else {  //上拉，加载更多推荐
                        boolean isAddData = false;
                        for (Album album : albumList) {
                            for (int i = 0; i < mAlbumList.size(); i++) {
                                if (mAlbumList.get(i).getId()==(album.getId())) {
//                                    LogUtil.d(TAG, ":::已经存在相同的专辑");
                                    break;
                                } else if (i == mAlbumList.size() - 1 && mAlbumList.get(i).getId()!=album.getId()) {
                                    mAlbumList.add(album);
                                    isAddData = true;
                                }
                            }
                        }
                        //获得数据后使用回调接口关闭UI层的加载页面
                        if (mOnDataListener != null) {
                            mOnDataListener.isGetData(isAddData ? null : "多刷几次或许会有更新的内容哦!");
                        }
                        //通知UI线程渲染更新数据
                        handlerRecommendResult(mAlbumList);
                    }
                }
            }

            /**
             * 获取数据失败,返回错误代码和消息
             * @param i
             * @param s
             */
            @Override
            public void onError(int i, String s) {
                LogUtil.e(TAG, "error-code ————>" + i + "  ,  error-message ————>" + s);
                handlerError();
            }
        });
    }

    /**
     * 上拉加载更多
     */
    @Override
    public void loadMore() {
        requstRecommendData(0);
    }

    /**
     * 注册回调
     *
     * @param callBack
     */
    @Override
    public void registerViewCallBack(IRecommendViewCallBack callBack) {
        //为防止重复加入，检测是否已存在集合中
        if (callBackList != null && !callBackList.contains(callBack)) {
            callBackList.add(callBack);
        }
    }

    /**
     * 取消回调
     *
     * @param callBack
     */
    @Override
    public void unRegisterViewCallBack(IRecommendViewCallBack callBack) {
        if (callBack != null) {
            callBackList.remove(callBack);
        }
    }

    // ==================== 接口回调
    private OnDataListener mOnDataListener = null;
    private OnInitDataListener mOnInitDataListener = null;

    public void setOnDataListener(OnDataListener onDataListener) {
        mOnDataListener = onDataListener;
    }

    public void setOnInitDataListener(OnInitDataListener onInitDataListener) {
        mOnInitDataListener = onInitDataListener;
    }

    public interface OnDataListener {
        void isGetData(String str);
    }

    public interface OnInitDataListener {
        void returnFirstData(Album album);
    }
}
